#include <stdio.h>
#include "linklist.h"

void test_get( linklist H, int pos );
void test_insert_pos( linklist H, data_t value, int pos );
void test_delete( linklist H, int pos );
void test_free( linklist H );
void test_reversal( linklist H );
void test_max( linklist H );
void test_merge();
void test_rank(); 

int main( int argc, char * argv[] ){

#if 0
    linklist H = list_create();
    if( H == NULL )
    {
	printf( "H is NULL\n" );
	return -1;
    } 

    printf("input: ");
    int value;	
    while( 1 )
    {
	scanf( "%d", &value );
	if( value == -1 )
	    break;

	list_tail_insert( H, value );
	printf("input: ");

    }

    list_show( H );
#endif

    //test_get( H, 2 );

    //test_insert_pos( H, 8527, 3 );
    //list_show( H );

    //test_delete( H, 1);
    //list_show( H );

   // test_free( H );

    //test_reversal( H );
    //list_show( H );

    //test_max( H );

    //test_merge();

    test_rank(); 

    return 0;
}


//测试尾部插入
void test_insert_pos( linklist H, data_t value, int pos ){

    printf( "在第%d节点插入元素%d,返回结果: %d\n", pos, value, list_insert( H, value, pos ) );
}


//测试表中指定节点的元素
void test_get( linklist H, int pos ){

    linklist p = list_get( H, pos );

    if( p ==NULL )
    {
	printf("p is NULL\n");
	return;
    }

    int val = p->data;
    printf( "链表中第%d节点的元素是: %d\n", pos, val );
}



//测试删除链表中某一节点
void test_delete( linklist H, int pos ){

    printf( "删除链表中第%d节点,返回结果: %d\n", pos, list_delete( H, pos ) );
}



//测死链表中释放所有元素
void test_free( linklist H ){

    printf( "链表中释放所有元素\n" );
    list_free( H );
    //list_show( H );
}


//测试反转
void test_reversal( linklist H ){

    printf( "进行反转,结果: %d\n", list_reversal( H ) );
}

//相邻两节点data值之和为最大的第一节点的指针
void test_max( linklist H ){

    data_t max;
    linklist p = list_max( H, &max );
    if( p == NULL )
	return;
    printf( "相邻两节点data值之和为最大的第一节点的指针,该指针的data值: %d, 最大值为: %d\n", p->data, max );
}


//测试有序表A和有序表B合并表A，表A递增有序
void test_merge( ){

    linklist H1, H2;
    int a[] = {1, 4, 6};
    int b[] = {2, 4, 16, 18, 30};
    int i;

    H1 = list_create();
    H2 = list_create();
    if ( H1 == NULL || H2 == NULL )
	return;


    for ( i = 0; i < sizeof(a)/sizeof(int); i++ )
    {
	list_tail_insert(H1, a[i]);
    }

    for ( i = 0; i < sizeof(b)/sizeof(int); i++ )
    {
	list_tail_insert(H2, b[i]);
    }

    list_show( H1 );
    list_show( H2 );

    list_merge( H1, H2 );

    list_show( H1 );
    list_show( H2 );

}

//排序
void test_rank( ){


    linklist H;
    int a[] = { 3, 5, 1, 4, 6};
    int i;

    H = list_create();
    if ( H == NULL )
	return;

    for ( i = 0; i < sizeof(a)/sizeof(int); i++ )
    {
	list_tail_insert(H, a[i]);
    }

    list_show( H );
    list_rank( H );
    list_show( H );


} 
